# 题目二: 以Lena为原始图像，通过OpenCV使用Sobel及Canny算子检测，比较边缘检测结果
import cv2 as cv

filename = r"D:\AI\Picture\lena.jpg"
img = cv.imread(filename)
# Sobel算子x方向边缘检测
x = cv.Sobel(img, cv.CV_16S, 1, 0)
# Sobel算子y方向边缘检测
y = cv.Sobel(img, cv.CV_16S, 0, 1)

"""
在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为Sobel函数求完导数后会有负值，还有会大于255的值。
而原图像是uint8，即8位无符号数，所以Sobel建立的图像位数不够，会有截断。
因此要使用16位有符号的数据类型，即cv2.CV_16S。

在经过处理后，别忘了用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像，而只是一副灰色的窗口。
"""
absX = cv.convertScaleAbs(x)  # 转回unit8
absY = cv.convertScaleAbs(y)
# canny算子
canny = cv.Canny(img, 100, 200)

cv.imshow("source image", img)
cv.imshow("Sobel absX", absX)
cv.imshow("Sobel absY", absY)
cv.imshow("canny image", canny)

cv.waitKey()
cv.destroyAllWindows()
